# 为了定义三个类
import random  # random() 方法返回随机生成的一个实数，它在[0,1)范围内
import pygame

"""
sdl的python封装，使用pygame，
你可以写出可以不作修改就可以在任何支持SDL的平台（Windows, Unix, Mac, BeOS，等等）
上运行的游戏或者多媒体程序。
pygame是基于python的游戏开发套件
"""
# 以下是三个类的定义：
"""
在pygame.sprite模块里面包含了一个名为Sprite类，他是pygame本身自带的一个精灵。
但是这个类的功能比较少，因此我们新建一个类对其继承，在sprite类的基础上丰富，以方便我们的使用。
精灵可以认为成是一个个小图片，一种可以在屏幕上移动的图形对象，并且可以与其他图形对象交互。
"""

'''板子'''
class Paddle(pygame.sprite.Sprite):
    def __init__(self, x, y, width, height, SCREENWIDTH, SCREENHEIGHT, **kwargs):  # screenwidth,screenheight
        pygame.sprite.Sprite.__init__(self)  # 完成初始化
        self.init_state = [x, y, width, height]  # 初始状态
        self.rect = pygame.Rect(x, y, width, height)  # self.rect负责在哪里显示
        self.base_speed = 10  # 长按移动键的时候，速度，数值越小，移动越慢
        self.SCREENWIDTH = SCREENWIDTH
        self.SCREENHEIGHT = SCREENHEIGHT

    '''移动板子'''
    def move(self, direction):
        if direction == 'left':
            self.rect.left = max(0, self.rect.left - self.base_speed)
        elif direction == 'right':
            self.rect.right = min(self.SCREENWIDTH, self.rect.right + self.base_speed)
        else:
            raise ValueError('Paddle.move.direction unsupport %s...' % direction)
        return True

    '''绑定到屏幕上'''
    def draw(self, screen, color):
        pygame.draw.rect(screen, color, self.rect)
        return True

    '''重置'''
    def reset(self):
        #将板子重置回到原来的位置
        self.rect = pygame.Rect(self.init_state[0], self.init_state[1], self.init_state[2], self.init_state[3])
        return True


'''球'''
class Ball(pygame.sprite.Sprite):
    def __init__(self, x, y, radius, SCREENWIDTH, SCREENHEIGHT, **kwargs):
        pygame.sprite.Sprite.__init__(self)
        self.init_state = [x, y, radius * 2, radius * 2]
        self.rect = pygame.Rect(x, y, radius * 2, radius * 2)
        self.base_speed = [5, 5]
        self.direction = [random.choice([1, -1]), -1]  # 初始弹出的方向是随机的
        self.radius = radius # 定义球的半径
        self.SCREENWIDTH = SCREENWIDTH
        self.SCREENHEIGHT = SCREENHEIGHT

    '''移动球'''

    def move(self):
        self.rect.left += self.direction[0] * self.base_speed[0]
        self.rect.top += self.direction[1] * self.base_speed[1]

        if self.rect.left <= 0:
            self.rect.left = 0
            self.direction[0] = -self.direction[0]
        elif self.rect.right >= self.SCREENWIDTH:
            self.rect.right = self.SCREENWIDTH
            self.direction[0] = -self.direction[0]
        if self.rect.top <= 0:
            self.rect.top = 0
            self.direction[1] = -self.direction[1]
        elif self.rect.bottom >= self.SCREENHEIGHT:
            return False
        return True

    '''改变运动速度和方向(与拍相撞时)'''

    def change(self):
        self.base_speed = [random.choice([4, 5, 6]), random.choice([4, 5, 6])]
        self.direction = [random.choice([1, -1]), -1]
        return True

    '''绑定到屏幕上'''

    def draw(self, screen, color):
        pygame.draw.circle(screen, color, (self.rect.left + self.radius, self.rect.top + self.radius), self.radius)
        return True

    '''重置'''

    def reset(self):
        self.rect = pygame.Rect(self.init_state[0], self.init_state[1], self.init_state[2], self.init_state[3])
        return True


'''砖块'''


class Brick(pygame.sprite.Sprite):
    def __init__(self, x, y, width, height, **kwargs):
        pygame.sprite.Sprite.__init__(self)
        self.init_state = [x, y, width, height]
        self.rect = pygame.Rect(x, y, width, height)

    '''绑定到屏幕上'''

    def draw(self, screen, color):
        pygame.draw.rect(screen, color, self.rect)
        return True

    '''重置'''

    def reset(self):
        self.rect = pygame.Rect(self.init_state[0], self.init_state[1], self.init_state[2], self.init_state[3])
        return True
